package concurrent.block;

import org.junit.Test;

import java.util.Iterator;
import java.util.Queue;
import java.util.concurrent.ArrayBlockingQueue;

/**
 * Java并发容器阻塞队列学习
 * ArrayBlockingQueue是数组实现的 线程安全的 有界的 阻塞队列。
 * 线程安全：通过“互斥锁”保护竞争资源，实现了多线程对竞争资源的互斥访问，内部是使用ReetreckLock实现的
 */
public class BlockingQueue {
    private static Queue<String> queue = new ArrayBlockingQueue<String>(20);

    @Test
    public void test1() {

        ArrayBlockingQueue blockingQueue = new ArrayBlockingQueue<String>(30);
        blockingQueue.add("11");

    }

    @Test
    public void test2() {

        // 同时启动两个线程对queue进行操作！
        new MyThread("ta").start();
        new MyThread("tb").start();
        while (Thread.activeCount()>=2){
            Thread.yield();
        }
        String value;
        Iterator iter = queue.iterator();
        while (iter.hasNext()) {
            value = (String) iter.next();
            System.out.print(value + ", ");
        }
        System.out.println("---------");
    }


    private static class MyThread extends Thread {
        MyThread(String name) {
            super(name);
        }

        @Override
        public void run() {
            int i = 0;
            while (i++ < 6) {
                // “线程名” + "-" + "序号"
                String val = Thread.currentThread().getName() + i;
                queue.add(val);
                // 通过“Iterator”遍历queue。

            }
        }
    }


}
